package prh25.biblioteca.service;

import java.util.List;



import org.apache.commons.validator.GenericValidator;

import prh25.biblioteca.entity.Aluno;
import prh25.biblioteca.entity.Documento;
import prh25.biblioteca.entity.Endereco;
import prh25.biblioteca.entity.Usuario;
import prh25.biblioteca.entity.dao.AlunoDAO;
import prh25.biblioteca.entity.dao.DAOFactory;
import prh25.biblioteca.entity.dao.EnderecoDAO;
import prh25.biblioteca.entity.dao.UsuarioDAO;
import prh25.biblioteca.entity.dao.hibernate.HibernateDAOFactory;
import prh25.biblioteca.entity.dao.hibernate.HibernateUtil;
import prh25.biblioteca.service.exception.RestricaoIntegridadeException;
import prh25.biblioteca.service.exception.UsuarioExistenteException;







public class AlunoServiceImpl implements AlunoService {

	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private AlunoDAO alunoDAO;

	/**
	 * Construtor da Classe AlunoServiceImpl
	 * @param alunoDAO
	 */
	public void setAlunoDAO(AlunoDAO alunoDAO) {
		this.alunoDAO = alunoDAO;
	}
	
	/**
	 * Salva um aluno no banco de dados.
	 * @param aluno - aluno a ser salvo no banco de dados.
	 * @return Id do aluno se foi salvo com sucesso.
	 */
	public Integer criar(Aluno aluno)  {
		validar(aluno);
		
		
		
		setAlunoDAO(HibernateDAOFactory.DEFAULT.buildAlunoDAO());
		
		
		
		aluno.getEndereco().uid();
		
		checkDuplicidade(aluno);
		
		
		
		try {
			HibernateUtil.beginTransaction();
			alunoDAO.saveOrUpdate(aluno);
			HibernateUtil.commitTransaction();
		} catch (Exception ex) {	
			ex.printStackTrace();
			HibernateUtil.rollbackTransaction();
			// Aqui deve ser adiconada o url de aviso de erro
		}finally{
			HibernateUtil.getSession().flush();
			HibernateUtil.getSession().clear();
		}
		
		return aluno.getId();
	}
	
	/**
	 * Valida os dados de um aluno.
	 * @param aluno - Aluno a ter os dados validados.
	 * @throws RestricaoIntegridadeException - Excecao lancada se houve alguma
	 * restricao de integridade.
	 */
	private void validar(Aluno aluno) throws RestricaoIntegridadeException {
		//validaEndereco(aluno.getEndereco());
		
		/*
		if (GenericValidator.isBlankOrNull(aluno.getCurso()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		
		
		*/
		
		if (GenericValidator.isBlankOrNull(aluno.getNome()))
			throw new RestricaoIntegridadeException("Nome Invalido");
		if (GenericValidator.isBlankOrNull(aluno.getMatricula()))
			throw new RestricaoIntegridadeException("Matricula Invalida");
		if (GenericValidator.isBlankOrNull(aluno.getLogin()))
			throw new RestricaoIntegridadeException("Login Invalido");
		if (GenericValidator.isBlankOrNull(aluno.getSenha()))
			throw new RestricaoIntegridadeException("Senha Invalida");
		if (!GenericValidator.isEmail(aluno.getEmail()))
			throw new RestricaoIntegridadeException("Email Invalido.");
		if(!aluno.getTipo().equals("Aluno")){
			throw new RestricaoIntegridadeException("Tipo Invalido.");
		}
		
	}

	/**
	 * Verifica se o aluno a ser inserido no banco de dados jah existe.
	 * @param aluno - Aluno a ser inserido.
	 */
	private void checkDuplicidade(Aluno aluno) {
		UsuarioDAO usuarioDAO = HibernateDAOFactory.DEFAULT.buildUsuarioDAO();
		
		List<Aluno> matriculas = alunoDAO.findByMatricula(aluno.getMatricula());
		List<Usuario> logins = usuarioDAO.findByLogin(aluno.getLogin());
		
		if (!matriculas.isEmpty() || !logins.isEmpty()) 
			throw new UsuarioExistenteException("Usuario ja existe");
	}
	
	
	@Override
	/**
	 * Salva um arquivo no banco de dados.
	 * @param documento - Documento a ser salvo no banco de dados.
	 * @param diretorioAplicacao - diretorio onde se encontra o arquivo.
	 * @return True se o arquivo foi salvo com sucesso, false caso contrario.
	 */
	public boolean finalizarEnvioArquivo(Documento documento, String diretorioAplicacao) {
		DocumentoService servico = new DocumentoServiceImpl();
		return servico.finalizarEnvioArquivo(documento, diretorioAplicacao);
	}
	


	

}